home *** CD-ROM | disk | FTP | other *** search
/ SGI Developer Toolbox 6.1 / SGI Developer Toolbox 6.1 - Disc 4.iso / public / sox / sfheader.h < prev    next >
C/C++ Source or Header  |  1994-08-01  |  3KB  |  121 lines

  1. # define SIZEOF_BSD_HEADER 1024
  2. # define SF_MAGIC 107364
  3. # define SF_LINK 107414
  4. # define SF_SHORT sizeof(short)
  5. # define SF_FLOAT sizeof(float)
  6. # define SF_BUFSIZE    (16*1024)
  7. # define SF_MAXCHAN    4
  8. # define MAXCOMM 512
  9. # define MINCOMM 256
  10.  
  11. /* Codes for sfcode */
  12. # define SF_END 0
  13. # define SF_MAXAMP 1
  14. # define SF_COMMENT 2
  15. # define SF_LINKCODE 3
  16.  
  17. typedef struct sfcode {
  18.     short    code;
  19.     short    bsize;
  20. } SFCODE;
  21.  
  22. typedef struct sfmaxamp {
  23.     float    value[SF_MAXCHAN];
  24.     long    samploc[SF_MAXCHAN];
  25.     long    timetag;
  26. } SFMAXAMP;
  27.  
  28. typedef struct sfcomment {
  29.     char     comment[MAXCOMM];
  30. } SFCOMMENT;
  31.  
  32. typedef struct sflink {
  33.     char     reality[50];
  34.     long     startsamp;
  35.     long    endsamp;
  36. } SFLINK;
  37.  
  38. struct sfinfo {    
  39.     long      sf_magic;
  40.     float      sf_srate;
  41.     long      sf_chans;
  42.     long      sf_packmode;
  43. /*    char      sf_codes;        /* BOGUS! */
  44.     SFCODE    sf_codes;
  45. } ;
  46.  
  47. typedef union sfheader {
  48.     struct  sfinfo sfinfo;
  49.     char    filler[SIZEOF_BSD_HEADER];
  50. } SFHEADER;
  51.  
  52. static SFCODE    ampcode = {
  53. SF_MAXAMP,
  54. sizeof(SFMAXAMP) + sizeof(SFCODE)
  55. };
  56.  
  57. # define sfchans(x) (x)->sfinfo.sf_chans
  58. # define sfmagic(x) (x)->sfinfo.sf_magic
  59. # define sfsrate(x) (x)->sfinfo.sf_srate
  60. # define sfclass(x) (x)->sfinfo.sf_packmode
  61. # define sfbsize(x) ((x)->st_size - sizeof(SFHEADER))
  62. # define sfcodes(x) (x)->sfinfo.sf_codes
  63.  
  64. # define ismagic(x) ((x)->sfinfo.sf_magic == SF_MAGIC)
  65. # define islink(x)  ((x)->sfinfo.sf_magic == SF_LINK)
  66.  
  67. # define sfmaxamp(mptr,chan) (mptr)->value[chan]
  68. # define sfmaxamploc(mptr,chan) (mptr)->samploc[chan]
  69. # define sfmaxamptime(x) (x)->timetag
  70. # define ismaxampgood(x,s) (sfmaxamptime(x) + 2  >= (s)->st_mtime)
  71.  
  72. # define sfcomm(x,n) (x)->comment[n]
  73.  
  74. # define realname(x) (x)->reality
  75. # define startsmp(x) (x)->startsamp
  76. # define endsmp(x) (x)->endsamp
  77. # define sfoffset(x,h) ((x)->startsamp * sfchans(h) * sfclass(h))
  78. # define sfendset(x,h) ((x)->endsamp * sfchans(h) * sfclass(h))
  79.  
  80. # define sflseek(x,y,z) lseek(x,(z != 0) ? y : ((y) + sizeof(SFHEADER)),z)
  81. # define rheader(x,y) read(x,(char *) y,sizeof(SFHEADER)) != sizeof(SFHEADER)
  82.  
  83. #define readopensf(name,fd,sfh,sfst,prog,result) \
  84. if ((fd = open(name, 0))  < 0) {  \
  85.     fprintf(stderr,"%s: cannot access file %s\n",prog,name); \
  86.     result = -1;  \
  87. } \
  88. else if (stat(name,&sfst)){ \
  89.     fprintf(stderr,"%s: cannot get status on %s\n",prog,name); \
  90.     result = -1;  \
  91. } \
  92. else if (rheader(fd,&sfh)){ \
  93.     fprintf(stderr,"%s: cannot read header from %s\n",prog,name); \
  94.     result = -1;  \
  95. } \
  96. else if (!ismagic(&sfh)){ \
  97.     fprintf(stderr,"%s: %s not a bsd soundfile\n",prog,name); \
  98.     result = -1;  \
  99. } \
  100. else result = 0;
  101.  
  102. #define rwopensf(name,fd,sfh,sfst,prog,result,code) \
  103. if ((fd = open(name, code))  < 0) {  \
  104.     fprintf(stderr,"%s: cannot access file %s\n",prog,name); \
  105.     result = -1;  \
  106. } \
  107. else if (rheader(fd,&sfh)){ \
  108.     fprintf(stderr,"%s: cannot read header from %s\n",prog,name); \
  109.     result = -1;  \
  110. } \
  111. else if (!ismagic(&sfh)){ \
  112.     fprintf(stderr,"%s: %s not a bsd soundfile\n",prog,name); \
  113.     result = -1;  \
  114. } \
  115. else if (stat(name,&sfst)){ \
  116.     fprintf(stderr,"%s: cannot get status on %s\n",prog,name); \
  117.     result = -1;  \
  118. } \
  119. else result = 0;
  120.  
  121.